package com.xingchi.tornado.sms.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.xingchi.tornado.basic.ErrorCode;
import com.xingchi.tornado.exception.BizException;
import com.xingchi.tornado.model.PageResult;
import com.xingchi.tornado.mybatisplus.service.AbstractBasePlusService;
import com.xingchi.tornado.sms.enums.PlatformType;
import com.xingchi.tornado.sms.mapper.NoteTemplateMapper;
import com.xingchi.tornado.sms.model.domain.NoteTemplateDO;
import com.xingchi.tornado.sms.model.dto.NoteTemplateCreateDTO;
import com.xingchi.tornado.sms.model.dto.NoteTemplateDTO;
import com.xingchi.tornado.sms.model.dto.NoteTemplateQueryDTO;
import com.xingchi.tornado.sms.model.dto.NoteTemplateUpdateDTO;
import com.xingchi.tornado.sms.model.vo.NoteTemplateVO;
import com.xingchi.tornado.sms.service.NoteTemplateService;
import com.xingchi.tornado.utils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 短信模板 服务实现类
 * </p>
 *
 * @author xingchi
 * @date 2024-05-27 15:33
 */
@Service
public class NoteTemplateServiceImpl extends AbstractBasePlusService<NoteTemplateMapper, NoteTemplateDTO, NoteTemplateQueryDTO, NoteTemplateDO> implements NoteTemplateService {

    @Autowired
    private NoteTemplateMapper noteTemplateMapper;

    @Override
    public Wrapper<NoteTemplateDO> getWrapper(NoteTemplateQueryDTO query) {
        return Wrappers.<NoteTemplateDO>lambdaQuery()
                .eq(Objects.nonNull(query.getType()), NoteTemplateDO::getType, query.getType())
                .eq(Objects.nonNull(query.getPlatform()), NoteTemplateDO::getPlatform, query.getPlatform())
                .eq(StringUtils.isNotBlank(query.getBusinessType()), NoteTemplateDO::getBusinessType, query.getBusinessType())
                .eq(StringUtils.isNotBlank(query.getSignName()), NoteTemplateDO::getSignName, query.getSignName())
                .eq(StringUtils.isNotBlank(query.getCode()), NoteTemplateDO::getCode, query.getCode())
                ;
    }

    /**
     * 查询所有的短信模板
     *
     * @return 短信模板list
     */
    @Override
    public List<NoteTemplateVO> findAll() {
        List<NoteTemplateDTO> list = this.selectByQuery(NoteTemplateQueryDTO.builder().isPagination(false).build());
        return BeanUtils.copyList(list, NoteTemplateVO.class);
    }

    /**
     * 分页查询短信模板信息
     *
     * @param query 查询条件
     * @return 查询结果
     */
    @Override
    public PageResult<NoteTemplateVO> pageList(NoteTemplateQueryDTO query) {
        PageResult<NoteTemplateDTO> pageResult = this.selectPageByQuery(query);
        return PageResult.fetchPage(pageResult, NoteTemplateVO.class);
    }

    /**
     * 根据短信模板id查询短信模板信息
     *
     * @param id 短信模板id
     * @return 短信模板信息
     */
    @Override
    public NoteTemplateVO findById(Long id) {
        return BeanUtils.convert(this.selectById(id), NoteTemplateVO.class);
    }

    /**
     * 根据业务类型查询短信模板信息
     *
     * @param businessType 短信模板类型
     * @return 短信模板信息
     */
    @Override
    public NoteTemplateVO selectByBusinessType(String businessType) {
        BizException.throwIf(StringUtils.isBlank(businessType), ErrorCode.PARAM_IS_INVALID, "业务类型不能为空");
        return BeanUtils.convert(this.selectOne(NoteTemplateQueryDTO.builder().businessType(businessType).build()), NoteTemplateVO.class);
    }

    /**
     * 创建短信模板信息
     *
     * @param noteTemplateCreateDTO 短信模板信息
     * @return 是否创建成功
     */
    @Override
    public boolean create(NoteTemplateCreateDTO noteTemplateCreateDTO) {
        Integer platform = noteTemplateCreateDTO.getPlatform();
        if (PlatformType.TENCENT.isType(platform)) {
            String appId = noteTemplateCreateDTO.getAppId();
            BizException.throwIf(StringUtils.isBlank(appId), ErrorCode.PARAM_IS_INVALID, "appId不能为空");
        }
        NoteTemplateDTO template = BeanUtils.convert(noteTemplateCreateDTO, NoteTemplateDTO.class);
        this.insert(template);
        return true;
    }

    /**
     * 根据id更新短信模板信息
     *
     * @param noteTemplateUpdateDTO 短信模板更新类型
     * @return 是否更新成功
     */
    @Override
    public boolean update(NoteTemplateUpdateDTO noteTemplateUpdateDTO) {
        Integer platform = noteTemplateUpdateDTO.getPlatform();
        if (PlatformType.TENCENT.isType(platform)) {
            String appId = noteTemplateUpdateDTO.getAppId();
            BizException.throwIf(StringUtils.isBlank(appId), ErrorCode.PARAM_IS_INVALID, "appId不能为空");
        }
        Long templateId = noteTemplateUpdateDTO.getId();
        NoteTemplateDTO noteTemplateDTO = this.selectById(templateId);
        BizException.throwIf(Objects.isNull(noteTemplateDTO), ErrorCode.DATA_NOT_FOUND, "短信模板不存在");

        NoteTemplateDTO template = BeanUtils.convert(noteTemplateUpdateDTO, NoteTemplateDTO.class);
        this.updateById(template);
        return true;
    }
}
